/*
处理多种错误类型

前面出现的例子都是很方便的情况；都是 Result 和其他 Result 交互，还有 Option 和其他 Option 交互。

有时 Option 需要和 Result 进行交互，或是 Result<T, Error1> 需要和 Result<T, Error2> 进行交互。
在这类情况下，我们想要以一种方式来管理不同的错误类型，使得它们可组合且易于交互。
*/

// 下面代码中，unwrap 的两个实例生成了不同的错误类型。
// Vec::first 返回一个 Option，
// parse::<i32> 返回一个 Result<i32, ParseIntError>
fn double_first(vec: Vec<&str>) -> i32 {
    let first = vec.first().unwrap();
    2 * first.parse::<i32>().unwrap()
}

fn main() {
    let numbers = vec!["42", "93", "18"];
    let empty = vec![];
    let strings = vec!["tofu", "93", "18"];

    println!("The first doubled is {}", double_first(numbers));

    println!("The first doubled is {}", double_first(empty));
    // ^ error1

    println!("The first doubled is {}", double_first(strings));
    // ^ error2
}